"""
@name : 02.装饰器
@author : wenyao
@projectname: xsfh
"""
#装饰器
#装饰器的本质就是闭包， 在不改变函数或类的源代码的基础上，添加额外功能
#装饰器的本质就是闭包函数，它需要callable对象作为参数传入（函数，类）

# import time
# def func1():
#     time.sleep(2)
#     print("func1....")

#时间戳
# print(time.time())

# import time
# def func1():
#     start = time.time()
#     time.sleep(2)
#     print("Start running time: %s" % start)
#     print("func1.....")
#     end = time.time()
#     print("End running time: %s" % end)
#     print('Running time: %s Seconds' % (end - start))
#
# func1()

#统计运行时间的装饰器
import time
def runtime(func):
    def inner():
        start = time.time()
        result = func()
        end = time.time()
        print(f"函数执行花费了{end-start}s")
        return  result
    return inner

#@语法糖 其实就是将被装饰的函数名传递给装饰器runtime去执行
#runtime返回内函数（inner），赋值给同名的被装饰函数变量
#函数被装饰之后，已经不是原来的函数了

# @runtime     #func1 = runtime(func1)
# def func1():
#     time.sleep(2)
#     print("func1....")
#     return 10000
#
# print(func1())

# def login_required(func):
#     def inner(a,b):
#         name = input("请输入用户名：")
#         if name == username:
#             print(f"欢迎{name}")
#             result = func(a,b)
#             print(f"结果为{result}")
#         else:
#             print(f"{name}没有权限")
#     return inner
#
# username = "root"

#使用可变长位置参数和可变长关键字参数,让你的装饰器更加通用
def login_required(func):
    def inner(*args, **kwargs):
        name = input("请输入用户名：")
        if name == username:
            print(f"欢迎{name}")
            result = func(*args, **kwargs)
            print(f"结果为{result}")
        else:
            print(f"{name}没有权限")
    return inner

username = "root"


@login_required
def add(a,b):
    return a + b
num1 = float(input("请输入第一个数："))
num2 = float(input("请输入第二个数："))
add(num1,num2)